package com.stark.commons.lang.util;

import org.apache.commons.lang3.StringUtils;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 日期处理方法集合。
 * @author Ben
 * @since 1.0.0
 * @version 1.0.0
 */
@SuppressWarnings("unused")
public class DateUtil {
	
	/**
	 * 日期格式，格式如 {@value #PATTERN_DATE} 。
	 */
	public static final int DATE = 0;
	/**
	 * 日期时间，格式如 {@value #PATTERN_DATETIME} 。
	 */
	public static final int DATETIME = 1;
	
	/**
	 * 日期格式，格式如 "yyyy-MM-dd" 。
	 */
	private static final String PATTERN_DATE = "yyyy-MM-dd";
	/**
	 * 日期时间，格式如 "yyyy-MM-dd HH:mm:ss" 。
	 */
	private static final String PATTERN_DATETIME = "yyyy-MM-dd HH:mm:ss";
	
	private static final String BAD_FORMAT_EXCEPTION = "日期字符串格式错误";
	
	/**
	 * 验证日期字符串是否合法，严格匹配 "yyyy-MM-dd"。
	 * @param dateStr 日期字符串。
	 * @return 是否合法。
	 */
	public static boolean isDate(String dateStr) {
		if (dateStr == null || dateStr.length() != 10) {
			return false;
		}
		String regex = "[1-2]{1}[0-9]{3}-[0-1]{1}[0-9]{1}-[0-3]{1}[0-9]{1}";
		Pattern pattern = Pattern.compile(regex);
		Matcher matcher = pattern.matcher(dateStr);
		return matcher.matches();
	}
	
	/**
	 * 验证日期字符串是否合法，严格匹配 "yyyy-MM-dd HH:mm:ss" 。
	 * @param dateStr 日期字符串。
	 * @return 是否合法。
	 */
	public static boolean isDatetime(String dateStr) {
		if (dateStr == null || dateStr.length() < 19) {
			return false;
		}
		if (dateStr.length() > 19) {
			dateStr = dateStr.substring(0, 19);
		}
		String regex = "[1-2]{1}[0-9]{3}-[0-1]{1}[0-9]{1}-[0-3]{1}[0-9]{1} [0-2]{1}[0-9]{1}:[0-5]{1}[0-9]{1}:[0-5]{1}[0-9]{1}";
		Pattern pattern = Pattern.compile(regex);
		Matcher matcher = pattern.matcher(dateStr);
		return matcher.matches();
	}
	
	/**
	 * 把日期字符串转换成日期对象。
	 * @param dateStr 日期字符串。
	 * @return {@link Date} 实例化对象。
	 */
	public static Date convertStrToDate(String dateStr) throws ParseException {
		if (!isDate(dateStr) && !isDatetime(dateStr)) {
			throw new ParseException(BAD_FORMAT_EXCEPTION, 0);
		}
		if (isDate(dateStr)) {
			dateStr += " 00:00:00";
		}
		
		SimpleDateFormat formatter = new SimpleDateFormat(PATTERN_DATETIME);
		return formatter.parse(dateStr);
	}
	
	/**
	 * 比较日期大小。
	 * @param dateStr 日期字符串。
	 * @param anotherDateStr 另一个日期字符串。
	 * @return dateStr 小于 anotherDateStr 时，返回负数；
	 * dateStr 等于 anotherDateStr 时，返回 <value>0</value> ；
	 * dateStr 大于 anotherDateStr 时，返回正数。
	 * @throws ParseException 日期字符串转日期对象时抛出异常。
	 * @see java.util.Date#compareTo(Date)
	 */
	public static int compare(String dateStr, String anotherDateStr) throws ParseException {
		Date date = convertStrToDate(dateStr);
		Date anotherDate = convertStrToDate(anotherDateStr);
		return date.compareTo(anotherDate);
	}
	
	/**
	 * 格式化日期。
	 * @param date {@link Date} 对象。
	 * @param pattern 格式。
	 * @return 格式化的日期字符串。
	 * @see java.text.SimpleDateFormat#format(Date)
	 */
	public static String format(Date date, String pattern) {
		if (null == date) {
			return "";
		}
		pattern = StringUtils.isBlank(pattern) ? PATTERN_DATETIME : pattern;
		
		return new SimpleDateFormat(pattern).format(date);
	}
	
	/**
	 * 格式化日期。
	 * @param date {@link Date} 对象。
	 * @param type {@link DateUtil#DATE} 或 {@link DateUtil#DATETIME} 。
	 * @return type 值为 {@link DateUtil#DATE} 时，返回 {@value #DATE} 格式的字符串；
	 * type 值为 {@link DateUtil#DATETIME} 时，返回 {@value #DATETIME} 格式的字符串。
	 * @see #format(Date, String)
	 */
	public static String format(Date date, int type) {
		String pattern;
		if (type == DATE) {
			pattern = PATTERN_DATE;
		} else if (type == DATETIME) {
			pattern = PATTERN_DATETIME;
		} else {
			throw new IllegalArgumentException("参数 type 非法");
		}

		return format(date, pattern);
	}
	
	/**
	 * 格式化日期字符串。
	 * @param dateStr 日期字符串。
	 * @param type {@link DateUtil#DATE} 或 {@link DateUtil#DATETIME} 。
	 * @return type 值为 {@link DateUtil#DATE} 时，返回 {@value #DATE} 格式的字符串；
	 * type 值为 {@link DateUtil#DATETIME} 时，返回 {@value #DATETIME} 格式的字符串。
	 * @throws ParseException 日期字符串转日期对象时抛出异常。
	 * @see #convertStrToDate(String)
	 * @see #format(Date, int)
	 */
	public static String format(String dateStr, int type) throws ParseException {
		Date date = convertStrToDate(dateStr);
		dateStr = format(date, type);
		return dateStr;
	}
	
	/**
	 * 格式化成中文日期。
	 * @param date {@link Date} 对象。
	 * @param type {@link DateUtil#DATE} 或 {@link DateUtil#DATETIME} 。
	 * @return type 值为 {@link DateUtil#DATE} 时，返回如 "2017年1月1日" 格式的字符串；
	 * type 值为 {@link DateUtil#DATETIME} 时，返回如 "2017年1月1日 下午1时30分" 格式的字符串。
	 */
	public static String formatCN(Date date, int type) {
		if (null == date) {
			return "";
		}
		
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(date);
		int yyyy = calendar.get(Calendar.YEAR);
		int MM = calendar.get(Calendar.MONTH) + 1;
		int dd = calendar.get(Calendar.DAY_OF_MONTH);
		
		if (type == DATE) {
			return yyyy + "年" + MM + "月" + dd + "日";
		}
		if (type == DATETIME) {
			int am = calendar.get(Calendar.AM_PM);
			int HH = calendar.get(Calendar.HOUR);
			int mm = calendar.get(Calendar.MINUTE);

			return yyyy + "年" + MM + "月" + dd + "日"
					+ (Calendar.AM == am ? "上午" : "下午")
					+ HH + "时"
					+ (mm == 0 ? "整" : mm + "分");
		}
		throw new IllegalArgumentException("参数 type 非法");
	}
	
	/**
	 * 格式化成中文日期。
	 * @param dateStr 日期字符串。
	 * @param type {@link DateUtil#DATE} 或 {@link DateUtil#DATETIME} 。
	 * @return type 值为 {@link DateUtil#DATE} 时，返回如 "2017年1月1日" 格式的字符串；
	 * type 值为 {@link DateUtil#DATETIME} 时，返回如 "2017年1月1日 下午1时30分" 格式的字符串。
	 * @throws ParseException 日期字符串转日期对象时抛出异常。
	 * @see #convertStrToDate(String)
	 * @see #formatCN(Date, int)
	 */
	public static String formatCN(String dateStr, int type) throws ParseException {
		Date date = convertStrToDate(dateStr);
		dateStr = formatCN(date, type);
		return dateStr;
	}
	
	/**
	 * 获取当前日期。
	 * @return 当前日期字符串，格式如 {@value #DATE} 。
	 * @see #format(Date, int)
	 */
	public static String getCurrDate() {
		return format(new Date(), DATE);
	}
	
	/**
	 * 获取当前日期和时间。
	 * @return 当前日期字符串，格式如 {@value #DATETIME} 。
	 * @see #format(Date, int)
	 */
	public static String getCurrTime() {
		return format(new Date(), DATETIME);
	}
	
	/**
	 * 获取中文格式的当前日期。
	 * @param pattern "long" 或 "full" 。
	 * @return pattern 为 "long" 时，返回如 "2017年1月1日" 格式的字符串；
	 * pattern 为 "full" 时，返回如 "2017年1月1日 星期日" 格式的字符串。
	 * @see #getDayCN(Date)
	 */
	public static String getCurrDateCN(String pattern) {
		Calendar calendar = Calendar.getInstance();
		int year = calendar.get(Calendar.YEAR);
		int month = calendar.get(Calendar.MONTH) + 1;
		int day = calendar.get(Calendar.DAY_OF_MONTH);
		
		if ("long".equalsIgnoreCase(pattern)) {
			return year + "年" + month + "月" + day + "日";
		}
		if ("full".equalsIgnoreCase(pattern)) {
			return year + "年" + month + "月" + day + "日 " + getDayCN(calendar.getTime());
		}
		throw new IllegalArgumentException("参数 pattern 非法");
	}
	
	/**
	 * 在给定日期上加（减）一段时间间隔。
	 * @param date {@link Date} 对象。
	 * @param field "yyyy" 、 "MM" 、 "dd" 、 "HH" 、 "mm" 、 "ss" 中之一。
	 * @param amount 间隔长度，当值小于 0 时做减法。
	 * @return field 为 "yyyy" 时，在给定日期上加 amount 年后返回。
	 * field 为 "MM" 时，在给定日期上加 amount 月后返回。
	 * field 为 "dd" 时，在给定日期上加 amount 日返回。
	 * field 为 "HH" 时，在给定日期上加 amount 小时后返回。
	 * field 为 "mm" 时，在给定日期上加 amount 分钟后返回。
	 * field 为 "ss" 时，在给定日期上加 amount 秒后返回。
	 */
	public static Date add(Date date, String field, int amount) {
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(date);
		if ("yyyy".equals(field)) {
			calendar.add(Calendar.YEAR, amount);
		} else if ("MM".equals(field)) {
			calendar.add(Calendar.MONTH, amount);
		} else if ("dd".equals(field)) {
			calendar.add(Calendar.DATE, amount);
		} else if ("HH".equals(field)) {
			calendar.add(Calendar.HOUR_OF_DAY, amount);
		} else if ("mm".equals(field)) {
			calendar.add(Calendar.MINUTE, amount);
		} else if ("ss".equals(field)) {
			calendar.add(Calendar.SECOND, amount);
		} else {
			throw new IllegalArgumentException("参数 field 非法");
		}
		return calendar.getTime();
	}
	
	/**
	 * 在给定日期字符串上加（减）一段时间间隔。
	 * @param dateStr 日期字符串。
	 * @param field "yyyy" 、 "MM" 、 "dd" 、 "HH" 、 "mm" 、 "ss" 中之一。
	 * @param amount 间隔长度，当值小于 0 时做减法。
	 * @param type {@link DateUtil#DATE} 或 {@link DateUtil#DATETIME} 。
	 * @return field 为 "yyyy" 时，在给定日期上加 amount 年后返回。
	 * field 为 "MM" 时，在给定日期上加 amount 月后返回；
	 * field 为 "dd" 时，在给定日期上加 amount 日返回；
	 * field 为 "HH" 时，在给定日期上加 amount 小时后返回；
	 * field 为 "mm" 时，在给定日期上加 amount 分钟后返回；
	 * field 为 "ss" 时，在给定日期上加 amount 秒后返回。
	 * 返回格式由 type 指定，参照 {@link #format(Date, int)} 方法。
	 * @throws ParseException 日期字符串转日期对象时抛出异常。
	 * @see #convertStrToDate(String)
	 * @see #add(Date, String, int)
	 * @see #format(Date, int)
	 */
	public static String add(String dateStr, String field, int amount, int type) throws ParseException {
		Date date = convertStrToDate(dateStr);
		date = add(date, field, amount);
		dateStr = format(date, type);
		return dateStr;
	}
	
	/**
	 * 计算日期差。
	 * @param date {@link Date} 对象。
	 * @param anotherDate 另一个 {@link Date} 对象。
	 * @param field "yyyy" 、 "MM" 、 "dd" 中之一。
	 * @return anotherDate - date 。 
	 * field 为 "yyyy" 时，返回相差年数；
	 * field 为 "MM" 时，返回相差月数；
	 * field 为 "dd" 时，返回相差天数；
	 */
	public static int diff(Date date, Date anotherDate, String field) {
		boolean reverse = date.compareTo(anotherDate) > 0;
		if (reverse) {
			Date tmp = date;
			date = anotherDate;
			anotherDate = tmp;
		}
		
		Calendar cal0 = Calendar.getInstance();
		cal0.setTime(date);
		int year0 = cal0.get(Calendar.YEAR);
		int month0 = cal0.get(Calendar.MONTH);
		Calendar cal1 = Calendar.getInstance();
		cal1.setTime(anotherDate);
		int year1 = cal1.get(Calendar.YEAR);
		int month1 = cal1.get(Calendar.MONTH);
		int yearDiff = year1 - year0;
		
		int diff = 0;
		if ("yyyy".equals(field)) {
			diff = yearDiff;
		} else if ("MM".equals(field)) {
			if (yearDiff <= 0) {
				diff = month1 - month0;
			} else if (yearDiff == 1) {
				diff = 12 - month0 + month1;
			} else {
				diff = 12 - month0 + (year1 - year0 - 1) * 12 + month1;
			}
		} else if ("dd".equals(field)) {
			if (yearDiff <= 0) {
				diff = cal1.get(Calendar.DAY_OF_YEAR) - cal0.get(Calendar.DAY_OF_YEAR);
			} else if (yearDiff == 1) {
				diff = getDaysLeftOfYear(date) + cal1.get(Calendar.DAY_OF_YEAR);
			} else {
				diff = getDaysLeftOfYear(date);
				Calendar calendar = Calendar.getInstance();
				for (int i = 1; i < yearDiff; i++) {
					calendar.setTime(add(date, "yyyy", i));
					diff += calendar.getActualMaximum(Calendar.DAY_OF_YEAR);
				}
				diff += cal1.get(Calendar.DAY_OF_YEAR);
			}
		}
		
		return reverse ? -1 * diff : diff;
	}
	
	/**
	 * 计算日期差。
	 * @param dateStr 日期字符串。
	 * @param anotherDateStr 另一个日期字符串。
	 * @param field "yyyy" 、 "MM" 、 "dd" 中之一。
	 * @return anotherDate - date 。 
	 * field 为 "yyyy" 时，返回相差年数；
	 * field 为 "MM" 时，返回相差月数；
	 * field 为 "dd" 时，返回相差天数；
	 * @throws ParseException 日期字符串转日期对象时抛出异常。
	 * @see #convertStrToDate(String)
	 * @see #diff(Date, Date, String)
	 */
	public static int diff(String dateStr, String anotherDateStr, String field) throws ParseException {
		Date date = convertStrToDate(dateStr);
		Date anotherDate = convertStrToDate(anotherDateStr);
		return diff(date, anotherDate, field);
	}
	
	/**
	 * 是否闰年。
	 * @param year 年度。
	 * @return 是否闰年。
	 */
	public static boolean isLeapYear(int year) {
		return (year % 4 == 0 && year % 100 != 0) || year % 400 == 0;
	}
	
	/**
	 * 给定日期当年是否闰年。
	 * @param date {@link Date} 对象。
	 * @return 是否闰年。
	 * @see #isLeapYear(int)
	 */
	public static boolean isLeapYear(Date date) {
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(date);
		return isLeapYear(calendar.get(Calendar.YEAR));
	}
	
	/**
	 * 计算给定日期当年总天数。
	 * @param date {@link Date} 对象。
	 * @return 给定日期当年总天数。
	 */
	public static int getDaysOfYear(Date date) {
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(date);
		return calendar.getActualMaximum(Calendar.DAY_OF_YEAR);
	}
	
	/**
	 * 计算给定日期当年剩余天数。
	 * @param date {@link Date} 对象。
	 * @return 给定日期当年剩余天数。
	 */
	public static int getDaysLeftOfYear(Date date) {
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(date);
		return calendar.getActualMaximum(Calendar.DAY_OF_YEAR) - calendar.get(Calendar.DAY_OF_YEAR);
	}
	
	/**
	 * 获得星期几（周日为 1 ，周六为 7 ）。
	 * @param date {@link Date} 对象。
	 * @return 星期几（周日为 1 ，周六为 7 ）。
	 */
	public static int getDay(Date date) {
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(date);
		return calendar.get(Calendar.DAY_OF_WEEK);
	}
	
	/**
	 * 获得中文星期几，如："星期一" 、 "星期日" 。
	 * @param date {@link Date} 对象。
	 * @return 中文星期几，如："星期一" 、 "星期日" 。
	 */
	public static String getDayCN(Date date) {
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(date);
		int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK);
		switch (dayOfWeek) {
			case 1:
				return "星期日";
			case 2:
				return "星期一";
			case 3:
				return "星期二";
			case 4:
				return "星期三";
			case 5:
				return "星期四";
			case 6:
				return "星期五";
			case 7:
				return "星期六";
			default:
				return "";
		}
	}
	
	/**
	 * 计算给定日期所在年的第一天。
	 * @param date {@link Date} 对象。
	 * @return 给定日期所在月的第一天。
	 */
	public static Date getFirstDayOfYear(Date date) {
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(date);
		calendar.set(Calendar.MONTH, 0);
		calendar.set(Calendar.DAY_OF_MONTH, 1);
		return calendar.getTime();
	}
	
	/**
	 * 计算给定日期所在年的最后一天。
	 * @param date {@link Date} 对象。
	 * @return 给定日期所在月的最后一天。
	 */
	public static Date getLastDayOfYear(Date date) {
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(date);
		calendar.set(Calendar.MONTH, 11);
		calendar.set(Calendar.DAY_OF_MONTH, 31);
		return calendar.getTime();
	}
	
	/**
	 * 计算给定日期所在月的第一天。
	 * @param date {@link Date} 对象。
	 * @return 给定日期所在月的第一天。
	 */
	public static Date getFirstDayOfMonth(Date date) {
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(date);
		calendar.set(Calendar.DAY_OF_MONTH, 1);
		return calendar.getTime();
	}
	
	/**
	 * 计算给定日期所在月的最后一天。
	 * @param date {@link Date} 对象。
	 * @return 给定日期所在月的最后一天。
	 */
	public static Date getLastDayOfMonth(Date date) {
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(date);
		calendar.set(Calendar.DAY_OF_MONTH, calendar.getActualMaximum(Calendar.DAY_OF_MONTH));
		return calendar.getTime();
	}
	
	/**
	 * 计算给定日期所在周的第一天（周一）。
	 * @param date {@link Date} 对象。
	 * @return 给定日期所在周的第一天（周一）。
	 */
	public static Date getFirstDayOfWeek(Date date) {
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(date);
		int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK);
		dayOfWeek = dayOfWeek == Calendar.SUNDAY ? 8 : dayOfWeek;
		int dValue = Calendar.MONDAY - dayOfWeek;
		calendar.add(Calendar.DAY_OF_WEEK, dValue);
		return calendar.getTime();
	}
	
	/**
	 * 计算给定日期所在月的最后一天。
	 * @param date {@link Date} 对象。
	 * @return 给定日期所在月的最后一天。
	 */
	public static Date getLastDayOfWeek(Date date) {
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(date);
		int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK);
		dayOfWeek = dayOfWeek == Calendar.SUNDAY ? 8 : dayOfWeek;
		int diff = 8 - dayOfWeek;
		calendar.add(Calendar.DAY_OF_WEEK, diff);
		return calendar.getTime();
	}
	
	/**
	 * 计算月视图中展示的第一天。
	 * @param date {@link Date} 对象。
	 * @return 月视图中展示的第一天。
	 */
	public static Date getFirstDayOfMonthView(Date date) {
		Date firstDayOfMonth = getFirstDayOfMonth(date);
		int dayOfWeek = getDay(firstDayOfMonth);
		int diff = Calendar.SUNDAY - dayOfWeek;
		
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(firstDayOfMonth);
		calendar.add(Calendar.DAY_OF_WEEK, diff);
		return calendar.getTime();
	}
	
	/**
	 * 计算月视图中展示的最后一天。
	 * @param date {@link Date} 对象。
	 * @return 月视图中展示的最后一天。
	 */
	public static Date getLastDayOfMonthView(Date date) {
		Date lastDayOfMonth = getLastDayOfMonth(date);
		int dayOfWeek = getDay(lastDayOfMonth);
		int diff = Calendar.SATURDAY - dayOfWeek;
		
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(lastDayOfMonth);
		calendar.add(Calendar.DAY_OF_WEEK, diff);
		return calendar.getTime();
	}
	
	/**
	 * 计算月视图展示行数。
	 * @param date {@link Date} 对象。
	 * @return 月视图展示行数。
	 */
	public static int getRowCntOfMonthView(Date date) {
		int dayOfWeek1 = getDay(getFirstDayOfMonth(date));
		int dayOfWeek2 = getDay(getLastDayOfMonth(date));
		
		if (dayOfWeek1 == Calendar.SUNDAY && dayOfWeek2 == Calendar.SATURDAY) {
			return 4;
		}
		if (dayOfWeek1 != Calendar.SUNDAY && dayOfWeek2 != Calendar.SATURDAY) {
			return 6;
		}
		return 5;
	}
	
	/**
	 * 设置日期为当天 0 点 0 分 0 秒 0 毫秒。
	 * @param date 日期对象。
	 * @return 日期对象。
	 */
	public static Date dateMinOfDay(Date date) {
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(date);
		calendar.set(Calendar.HOUR_OF_DAY, 0);
		calendar.set(Calendar.MINUTE, 0);
		calendar.set(Calendar.SECOND, 0);
		calendar.set(Calendar.MILLISECOND, 0);
		return calendar.getTime();
	}
	
	/**
	 * 设置日期为当天 23 点 59 分 59 秒 999 毫秒。
	 * @param date 日期对象。
	 * @return 日期对象。
	 */
	public static Date dateMaxOfDay(Date date) {
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(date);
		calendar.set(Calendar.HOUR_OF_DAY, 23);
		calendar.set(Calendar.MINUTE, 59);
		calendar.set(Calendar.SECOND, 59);
		calendar.set(Calendar.MILLISECOND, 499);
		return calendar.getTime();
	}
	
	/**
	 * 获取日期年。
	 * @param date 日期。
	 * @return 年。
	 */
	public static int getYear(Date date) {
		return getField(date, Calendar.YEAR);
	}
	
	/**
	 * 获取日期月。
	 * @param date 日期。
	 * @return 月，1-12。
	 */
	public static int getMonth(Date date) {
		return getField(date, Calendar.MONTH) + 1;
	}
	
	/**
	 * 获取日期天。
	 * @param date 日期。
	 * @return 天。
	 */
	public static int getDate(Date date) {
		return getField(date, Calendar.DAY_OF_MONTH);
	}
	
	/**
	 * 获取日期小时。
	 * @param date 日期。
	 * @return 小时，0-23。
	 */
	public static int getHours(Date date) {
		return getField(date, Calendar.HOUR_OF_DAY);
	}
	
	/**
	 * 获取日期分钟。
	 * @param date 日期。
	 * @return 分钟。
	 */
	public static int getMinutes(Date date) {
		return getField(date, Calendar.MINUTE);
	}
	
	/**
	 * 获取日期秒。
	 * @param date 日期。
	 * @return 秒。
	 */
	public static int getSeconds(Date date) {
		return getField(date, Calendar.SECOND);
	}
	
	/**
	 * 获取日期属性。
	 * @param date 日期。
	 * @param field 属性。
	 * @return 属性值。
	 */
	private static int getField(Date date, int field) {
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(date);
		return calendar.get(field);
	}
	
}